package com.adu.getpdf.service;


import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.*;
import org.springframework.stereotype.Service;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Service
public class PdfService {

    /**
     * 生产pdf文件
     * @param templatePath pdf模板地址
     * @param outFilePath  生成文件地址
     * @return
     */
    public String generatePdf(String templatePath,String outFilePath){
        PdfReader reader;
        FileOutputStream out;
        ByteArrayOutputStream bos;
        PdfStamper stamper;
        try{
            //输出流
            out=new FileOutputStream(new File(outFilePath));
            //读取pdf模板
            reader=new PdfReader(templatePath);
            bos=new ByteArrayOutputStream();
            stamper=new PdfStamper(reader,bos);

            // 获得pdf模板中的文字域
            AcroFields form=stamper.getAcroFields();

            // 设置文字样式
            BaseFont baseFont =BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
            ArrayList<BaseFont> fonts=new ArrayList<>();
            fonts.add(baseFont);
            form.setSubstitutionFonts(fonts);

            // 设置填充的文字内容
            Map<String,String> map=new HashMap<>();
            map.put("name","菜鸟阿都");
            map.put("url","www.cainiaobuluo.com");
            map.put("date","2022-04-15");

            // 填充pdf模板中的文本域
            for(Map.Entry<String,String> entry:map.entrySet()){
                form.setField(entry.getKey(),entry.getValue());
            }

            // 如果为false，生成的PDF文件可以编辑，如果为true，生成的PDF文件不可以编辑
            stamper.setFormFlattening(true);
            stamper.close();

            //创建空的文档，并将生产的pdf复制到文档中
            Document doc = new Document();
            PdfCopy copy = new PdfCopy(doc, out);
            doc.open();
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
            copy.addPage(importPage);
            // 关闭文档
            doc.close();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return "成功";
    }

}
